package com.edu.interceptor;
/*
 * @Author:princess
 * @Date 2023/11/30 11 30 9:01
 *
 */

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.logging.Handler;

public class MyInterceptor implements HandlerInterceptor {
    /*
        preHandle 在Controller里的方法执行之前执行
            返回值：return true 表示放行，return false 表示不放行
            request：发过来的请求
            response：响应对象
            handler：被拦截的那个处理器(被拦截的方法)
                获取被拦截方法的方法名
                获取被拦截方法的所在类名
                获取被拦截方法的参数
            如果return false不放行 一般通过request response对象进行页面跳转

            实现的功能：权限验证 日志记录
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了自定义拦截器的前置处理");
        HandlerMethod method = (HandlerMethod) handler;
        System.out.println("被拦截的方法"+method.getMethod().getName());
        System.out.println("被拦截的Controller类名"+method.getBean().getClass().getName());
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    /*
        postHandle 在业务方法执行完毕之后，页面渲染之前 执行
            request response handler同上
            ModelAndView 就是 Controller 执行完毕之后 返回的 那个 modelAndView对象
            modelAndView 可以被修改，会影响最终页面的生成

            注意：如果被拦截的方法发生异常，那么 postHandle 就不会再执行

            实现的功能：敏感词过滤
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法之心");
        System.out.println(modelAndView.getViewName());
    }

    /*
        afterCompletion 是在 页面渲染之后
        request response handler同上
        Exception ex 整个过程中发生的异常

        实现的功能：异常日志 统一异常处理
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("页面渲染完毕");
        if(ex != null){
           request.getRequestDispatcher("error.jsp").forward(request,response);
        }
    }
}
